
#define MAXSAMPLES            512
#define MAXSAMPLESINPATCH     16
#define SAMPLE_SAWTOOTH       0
#define SAMPLE_SINE           1
#define SAMPLE_SQUARE         2
#define SAMPLE_NOT_FOUND      0xffff
#define ILLEGAL_SAMPLE        0xffff

#define ALL_OCTAVES           0xffffffff

#define SUSTAIN_INFINITE      0
#define NO_LOOPING            0xffffffff

#define INFINITE_LENGTH       0x7fffffff


extern SAMPLEINDEX defaultsample;


void instruments_initialise(void);
void instruments_kill(void);
SAMPLEINDEX instruments_create_sample(char *name, unsigned int length, unsigned int looppoint, unsigned char format);
SAMPLEINDEX instruments_install_sample(char *name, signed short *data, unsigned int length, unsigned int looppoint, unsigned char format);
SAMPLEINDEX instruments_create_sample_part(char *name, SAMPLEINDEX si, unsigned int start, unsigned int end, unsigned int looppoint);
SAMPLEINDEX instruments_new_sample(char *name, unsigned int length, int external, unsigned int looppoint, unsigned char format);
int instruments_remove_sample(SAMPLEINDEX si);
int instruments_map(SAMPLEINDEX si, unsigned int bank, unsigned int patchi, unsigned int octave, unsigned int frequency);
int instruments_unmap(unsigned int bank, unsigned int patchi, unsigned int octave);
int instruments_unmap_drum(unsigned int bank, unsigned int drumi);
int instruments_set_envelope(unsigned int banki, unsigned int patchi, AHDSR *envelope, unsigned int maxduration);
int instruments_set_drum_envelope(unsigned int banki, unsigned int drumi, AHDSR *envelope, unsigned int maxduration);
int instruments_set_drum_name(unsigned int banki, unsigned int drumi, char *name);
int instruments_set_patch_name(unsigned int banki, unsigned int patchi, char *name);
int instruments_set_sample_name(SAMPLEINDEX si, char *name);
void instruments_set_default_sample(SAMPLEINDEX si);
SAMPLEDATA *instruments_get_sample_ptr(SAMPLEINDEX si);

int instruments_get_sample_info(SAMPLEINDEX si, signed short **data, unsigned int *length, unsigned int *looppoint, unsigned char *format);
int instruments_map_drum(SAMPLEINDEX si, unsigned int banki, unsigned int drumi, unsigned int frequency);
int instruments_get_sample_info2(SAMPLEINDEX si, char *name, unsigned int *usage);
PATCH *instruments_get_patch(unsigned int bank, unsigned int patchi);
DRUM *instruments_get_drum(unsigned int bank, unsigned char notei);
SAMPLEINDEX instruments_enumerate_samples(SAMPLEINDEX si, char *name, unsigned int *usage);

SAMPLEINDEX instruments_find_named_sample(char *name);
int instruments_set_patch_name(unsigned int banki, unsigned int patchi, char *name);

int instruments_use_sample(SAMPLEINDEX samplei, int use);

void build_from_harmonics(signed short *sample, int length, int wavelength, int *harmonics, int wavetype);
